package edu.unicauca.opentextbook.controladores;

import edu.unicauca.opentextbook.entidades.Grupo;
import edu.unicauca.opentextbook.entidades.Usuario;
import edu.unicauca.opentextbook.fachadas.GrupoFacade;
import edu.unicauca.opentextbook.fachadas.UsuarioFacade;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import org.primefaces.event.TabChangeEvent;

@ManagedBean(name = "grupoController")
@ViewScoped
public class GrupoController extends BaseController implements Serializable {

    @ManagedProperty("#{loginController}")
    private LoginController loginController;
    //EJBs
    @EJB
    private GrupoFacade grupoFacade;
    @EJB
    private UsuarioFacade usuarioFacade;
    //Listas
    private List<Grupo> listaGrupos;

    //Metodos
    @PostConstruct
    public void init() {
    }

    public void onTabChange(TabChangeEvent event) {
        if ("Grupos".equals(event.getTab().getTitle()) || "Libreria".equals(event.getTab().getTitle())) {
            consultarGrupos();
        }
    }

    public void consultarGrupos() {
        final Usuario usuario = usuarioFacade.buscarUsuarioPorNick(loginController.getNick());
        listaGrupos = grupoFacade.consultarGrupos(usuario.getIdUsuario());
    }

    public String redireccionarPreProduccion(int idLibro) {
        return "/faces/vistas/preProduccion?libro=" + idLibro + "faces-redirect=true";
    }

    //Converter
    @FacesConverter(forClass = Grupo.class)
    public static class GrupoControllerConverter implements Converter {

        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            GrupoController controller = (GrupoController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "grupoController");
            return controller.grupoFacade.find(getKey(value));
        }

        int getKey(String value) {
            int key;
            key = Integer.parseInt(value);
            return key;
        }

        String getStringKey(int value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof Grupo) {
                Grupo o = (Grupo) object;
                return getStringKey(o.getIdGrupo());
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Grupo.class.getName());
            }
        }
    }

    //Getters y Setters
    public List<Grupo> getListaGrupos() {
        return listaGrupos;
    }

    public void setListaGrupos(List<Grupo> listaGrupos) {
        this.listaGrupos = listaGrupos;
    }

    public LoginController getLoginController() {
        return loginController;
    }

    public void setLoginController(LoginController loginController) {
        this.loginController = loginController;
    }
}
